import {defineStore} from 'pinia';

export const flowServiceStore = defineStore('flowService', {
    state: () => ({
        graph: null, // 编排器
        stencil: null, // 图形库
        stencilList: [
            {
                title: "通用组件",
                data:[
                    {
                        name: 'start-node',
                        label: '开始',
                        component: 'Default',
                        img: new URL('@/assets/imgs/icon-start.png', import.meta.url).href
                    },
                    {
                        name: 'end-node',
                        label: '结束',
                        component: 'Default',
                        img: new URL('@/assets/imgs/icon-end.png', import.meta.url).href
                    },

                    // {
                    //     name: 'variable-node',
                    //     label: '变量',
                    // },
                ]
            },
            {
                title: "输入组件",
                data:[
                    // {
                    //     name: 'table-input-node',
                    //     label: '库表输入',
                    //     component: 'TableInput',
                    //
                    // },
                    // {
                    //     name: 'ftp-input-node',
                    //     label: 'ftp输入',
                    // },
                    // {
                    //     name: 'text-input-node',
                    //     label: '文本输入',
                    // },
                    // {
                    //     name: 'csv-input-node',
                    //     label: 'csv输入',
                    // },
                ]
            },
            {
                title: "输出组件",
                data:[
                    // {
                    //     name: 'table-output',
                    //     label: '库表输出',
                    //     component: 'TableOutput',
                    // },
                    // {
                    //     name: 'ftp-output',
                    //     label: 'ftp输出',
                    // },
                    // {
                    //     name: 'text-output',
                    //     label: '文本输出',
                    // },
                    // {
                    //     name: 'csv-output',
                    //     label: 'csv输出',
                    // },
                ]
            },
            {
                title: "Streaming组件",
                data:[]
            },
            {
                title: "数据转换组件",
                data: []
            },
            {
                title: "数据运算组件",
                data: []
            },
            {
                title: "应用组件",
                data: []
            },
            {
                title: "流程组件",
                data: []
            },
            {
                title: "脚本组件",
                data: []
            },
            {
                title: "查询组件",
                data: []
            }

            // {
            //     title: "数据转换组件",
            //     data: [
            //         {
            //             name: 'mapping-data-node',
            //             label: '字段名映射',
            //         },
            //         {
            //             name: 'clear-data-node',
            //             label: '数据清洗',
            //         },
            //         {
            //             name: 'encrypt-data-node',
            //             label: '数据加密',
            //         },
            //         {
            //             name: 'json-data-node',
            //             label: 'JSON转换器',
            //         },
            //     ]
            // },
            // {
            //     title: "数据运算组件",
            //     data: [
            //         {
            //             name: 'aggregate-data-node',
            //             label: '多路合并',
            //         },
            //         {
            //             name: 'split-data-node',
            //             label: '多路分发',
            //         },
            //         {
            //             name: 'condition-data-node',
            //             label: '条件分支',
            //         },
            //         {
            //             name: 'sort-data-node',
            //             label: '数据排序',
            //         }
            //     ]
            // },
            // {
            //     title: "脚本组件",
            //     data: [
            //         {
            //             name: 'script-node',
            //             label: '脚本组件',
            //         },
            //         {
            //             name: 'java-node',
            //             label: 'JAVA脚本',
            //         },
            //         {
            //             name: 'python-node',
            //             label: 'Python脚本',
            //         },
            //         {
            //             name: 'shell-node',
            //             label: 'Shell脚本',
            //         }
            //     ]
            // }
        ], // 图形库列表
        flowData: {
        }, // 流程数据
        logDisposition:{

        },
        currentId: 0, // id计数器
        currentEdgeId: 0, // 连接线id计数器
        recycledNodeIds: [], // 节点id回收池
        recycledEdgeIds: [], // 边id回收池

    }),
    actions: {
        setStencilList(data) {
          this.stencilList = data;
        },
        setGraph(data) {
            this.graph = data;
        },
        setFlowData(data) {
            this.flowData = data;
        },
        setLogDisposition(data) {
            this.logDisposition = data;
        },
        // node节点id生成规则
        generateNextId() {
            // 优先使用回收池中的id
            if (this.recycledNodeIds.length > 0) {
                return this.recycledNodeIds.pop();
            }
            if (this.currentId > 9999) {
                this.currentId = 1;
                console.log("id计数器已重置，当前节点数超过9999");
            } else {
                this.currentId += 1;
                return `Z${this.currentId.toString().padStart(4, '0')}`;
            }
        },
        // 连接线id生成
        generateNextEdgeId() {
            if (this.recycledEdgeIds.length > 0) {
                return this.recycledEdgeIds.pop();
            }
            this.currentEdgeId += 1;
            return `R${this.currentEdgeId.toString().padStart(4, '0')}`;
        },
        // 回收节点 ID
        recycleNodeId(id) {
            if (id.startsWith('Z')) {
                this.recycledNodeIds.push(id);
            }
        },
        // 回收边 ID
        recycleEdgeId(id) {
            if (id.startsWith('R')) {
                this.recycledEdgeIds.push(id);
            }
        },
        // 重置id计数器
        resetIdCounter() {
            this.currentId = 0;
            this.currentEdgeId = 0;
        },
        // 加载已有数据时更新计数器
        updateIdCounterFromExistingData() {
            this.recycledNodeIds = [];
            this.recycledEdgeIds = [];
            // 处理节点id
            const nodeIdRegex = /^Z(\d{4})$/;
            const nodeIds = Object.keys(this.flowData)
              .filter(id => nodeIdRegex.test(id))
              .map(id => parseInt(id.substring(1), 10));
            this.currentId = nodeIds.length ? Math.max(...nodeIds) : 0;
            // 处理边id
            const edgeIdRegex = /^R(\d{4})$/;
            const edgeIds = Object.keys(this.flowData)
              .filter(id => edgeIdRegex.test(id))
              .map(id => parseInt(id.substring(1), 10));
            this.currentEdgeId = edgeIds.length ? Math.max(...edgeIds) : 0;
            // 生成可用id池
            const getAvailableIds = (maxId, prefix) => {
                const exists = new Set(Object.keys(this.flowData));
                return Array.from({length: maxId}, (_, i) => `${prefix}${(i+1).toString().padStart(4,'0')}`)
                  .filter(id => !exists.has(id));
            };
            this.recycledNodeIds.push(...getAvailableIds(this.currentId, 'Z'));
            this.recycledEdgeIds.push(...getAvailableIds(this.currentEdgeId, 'R'));
        },
        // 加载数据
        async loadData(data) {
            this.flowData = data;
            this.updateIdCounterFromExistingData();
            if (this.currentId === 0 && Object.keys(data).length > 0) {
                this.currentId = 1;
            }
        }

    },
});

